package edu.client;

import  com.google.gwt.i18n.client.DateTimeFormat;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;

import edu.client.ComprasService.ComprasService;
import edu.client.ComprasService.ComprasServiceAsync;
import edu.shared.DTO.OrdenCompraProductoDTO;

public class P_BuscarOrdenCompraProducto extends Composite{
	
	//columna de la tabla de órdens de compra
	private static final int COL_NUMERO_ORDEN = 0;
	private static final int COL_FECHA_GENERACION = 1;
	private static final int COL_PROVEEDOR = 2;
	private static final int COL_ESTADO_ORDEN = 3;
	private static final int COL_MAS_INFO = 4;
	
	private ListBox cbProveedores;
	private ListBox cbEstado;
	private FlexTable ftOrdenes;
	
	private TabPanel tpPadre;
	private ComprasServiceAsync comprasService;
	private List<String> proveedores;
	private List<OrdenCompraProductoDTO> ordenes;
	
	public P_BuscarOrdenCompraProducto(TabPanel padre)
	{
		tpPadre = padre;
		comprasService = GWT.create(ComprasService.class);
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);		
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "622px");
		
		Label lblFiltrarPor = new Label("FILTROS");
		lblFiltrarPor.setStyleName("labelTitulo");
		layoutPanel.add(lblFiltrarPor);
		layoutPanel.setWidgetLeftWidth(lblFiltrarPor, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblFiltrarPor, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label lblProveedor = new Label("PROVEEDOR:");
		lblProveedor.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblProveedor);
		layoutPanel.setWidgetLeftWidth(lblProveedor, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblProveedor, 85.0, Unit.PX, 19.0, Unit.PX);
		
		cbProveedores = new ListBox();		
		layoutPanel.add(cbProveedores);
		layoutPanel.setWidgetLeftWidth(cbProveedores, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cbProveedores, 81.0, Unit.PX, 32.0, Unit.PX);
		
		Label lblEstado = new Label("ESTADO:");
		lblEstado.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblEstado);
		layoutPanel.setWidgetLeftWidth(lblEstado, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblEstado, 85.0, Unit.PX, 19.0, Unit.PX);
		
		cbEstado = new ListBox();
		layoutPanel.add(cbEstado);		
		layoutPanel.setWidgetLeftWidth(cbEstado, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cbEstado, 81.0, Unit.PX, 32.0, Unit.PX);		
		
		String[] estados = { "TODOS LOS ESTADOS", "CANCELADA", "GENERADA", "GUARDADA", "VALIDADA" }; 
		
		for(String estado : estados)
			cbEstado.addItem(estado);
		
		Button btnFiltrar = new Button("");
		btnFiltrar.setText("BUSCAR");
		
		//cuando se presiona el botón filtrar
		btnFiltrar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				String proveedor = null;
				String estado = null;
				
				//si no se seleccionó "<Todos>" en proveedores
				if(cbProveedores.getSelectedIndex() != 0)
						proveedor = cbProveedores.getValue(cbProveedores.getSelectedIndex());
				
				//si no se seleccionó "<Todos>" en estado	
				if(cbEstado.getSelectedIndex() != 0)
					estado = cbEstado.getValue(cbEstado.getSelectedIndex());
				
				filtrarOrdenes(proveedor, estado);
			}
		});

		layoutPanel.add(btnFiltrar);
		layoutPanel.setWidgetLeftWidth(btnFiltrar, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(btnFiltrar, 135.0, Unit.PX, 28.0, Unit.PX);
		
		Label lblOrdenes = new Label("ÓRDENES DE COMPRA DE PRODUCTOS");
		lblOrdenes.setStyleName("labelTitulo");
		layoutPanel.add(lblOrdenes);
		layoutPanel.setWidgetLeftWidth(lblOrdenes, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblOrdenes, 180.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel spOrdenes = new ScrollPanel();
		spOrdenes.setStyleName("tabla");
		layoutPanel.add(spOrdenes);
		layoutPanel.setWidgetLeftWidth(spOrdenes, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spOrdenes, 250.0, Unit.PX, 250.0, Unit.PX);
		
		ftOrdenes = new FlexTable();
		spOrdenes.setWidget(ftOrdenes);
		ftOrdenes.setSize("100%", "100%");
		
		//columnas de la tabla de órdenes		
		//columna número de orden
		ftOrdenes.setText(0, COL_NUMERO_ORDEN, "Nº ORDEN COMPRA");
		ftOrdenes.getCellFormatter().setWidth(0, COL_NUMERO_ORDEN, "10%");
		
		//columna fecha de generación
		ftOrdenes.setText(0, COL_FECHA_GENERACION, "FECHA DE GENERACIÓN");
		ftOrdenes.getCellFormatter().setWidth(0, COL_FECHA_GENERACION, "15%");
		
		//columna proveedor
		ftOrdenes.setText(0, COL_PROVEEDOR, "PROVEEDOR");
		ftOrdenes.getCellFormatter().setWidth(0, COL_PROVEEDOR, "40%");
		
		//columna estado orden
		ftOrdenes.setText(0, COL_ESTADO_ORDEN, "ESTADO");
		ftOrdenes.getCellFormatter().setWidth(0, COL_ESTADO_ORDEN, "25%");
		
		//columna más información
		ftOrdenes.setText(0, COL_MAS_INFO, "+ INFO");
		ftOrdenes.getCellFormatter().setWidth(0, COL_MAS_INFO, "10%");
		
		Label lblPie = new Label("");
		lblPie.setStyleName("labelTitulo");
		layoutPanel.add(lblPie);
		layoutPanel.setWidgetLeftWidth(lblPie, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblPie, 500.0, Unit.PX, 50.0, Unit.PX);
		
		Button btnSalir = new Button("");
		btnSalir.setText("SALIR");
		
		//al presionar el botón salir
		btnSalir.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				//cerramos la pantalla
				tpPadre.remove(Validaciones.numeroElemento(tpPadre, "BUSCAR ORDEN COMPRA PRODUCTO"));		
			}
		});
		
		layoutPanel.add(btnSalir);
		layoutPanel.setWidgetRightWidth(btnSalir, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnSalir, 15.0, Unit.PX, 28.0, Unit.PX);
				
		// seteamos el estilo a los encabezados
		ftOrdenes.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		cargarProveedores();
		filtrarOrdenes(null, null);
	}
	
	
	/**
	 * Método que carga el combobox de proveedores con todos los proveedores de la base de datos
	 */
	private void cargarProveedores()
	{
		comprasService.buscarNombresProveedores(new AsyncCallback<List<String>>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());				
			}

			@Override
			public void onSuccess(List<String> result) {
				proveedores = result;
				
				cbProveedores.addItem("TODOS LOS PROVEEDORES");
				
				for(String proveedor : proveedores)
					cbProveedores.addItem(proveedor);
			}
		});
	}
	
	
	/**
	 * Método que filtra las órdenes de compra de producto por el proveedores seleccionado.
	 * Si el proveedor es "< Todos >" se traen todas las órdenes de compra.
	 * @param proveedor. Proveedor seleccionado.
	 */
	private void filtrarOrdenes(String proveedor, String estado)
	{
		ftOrdenes.clear();
		
		comprasService.buscarOrdenesCompraProductoPorProveedor(proveedor, estado, new AsyncCallback<List<OrdenCompraProductoDTO>>()
		{
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());	
			}

			@Override
			public void onSuccess(List<OrdenCompraProductoDTO> result) {
				ordenes = result;
				
				//se utiliza para formatear fechas
				DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
				
				int numeroFila = 1;
				
				for(OrdenCompraProductoDTO orden : ordenes)
				{					
					//columna número de orden
					ftOrdenes.setWidget(numeroFila, COL_NUMERO_ORDEN, new Label(String.valueOf(orden.getIdOrden())));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_NUMERO_ORDEN, true);
					
					//columna fecha generación
					ftOrdenes.setWidget(numeroFila, COL_FECHA_GENERACION, new Label(String.valueOf(formatoFecha.format(orden.getFechaGeneracion()))));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_FECHA_GENERACION, true);
					
					//columna proveedor
					ftOrdenes.setWidget(numeroFila, COL_PROVEEDOR, new Label(orden.getProveedor()));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_PROVEEDOR, true);
					
					//columna estado orden
					ftOrdenes.setWidget(numeroFila, COL_ESTADO_ORDEN, new Label(orden.getEstado()));
					ftOrdenes.getCellFormatter().setWordWrap(numeroFila, COL_ESTADO_ORDEN, true);
					
					// imagen más información
					Label info = new Label("");
					info.setSize("16px", "16px");
					info.setStyleName("labelInfo");
					
					//cuando se presiona "más información"
					info.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							//obtenemos la celda en donde se hizo click
							Cell celda = ftOrdenes.getCellForEvent(event);
							
							//obtenemos la orden de fabricación. Restamos 1 al row index porque la fila 1 es el encabezado
							OrdenCompraProductoDTO orden = ordenes.get(celda.getRowIndex() - 1);
							
							cargarMasInformacion(orden.getIdOrden());
						}
					});
					
					// columna más información
					ftOrdenes.setWidget(numeroFila, COL_MAS_INFO, info);
					ftOrdenes.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
					
					//no se permite acceder a la información de una orden cancelada
					if(orden.getEstado().equals("CANCELADA"))
						info.setVisible(false);
					
					//seteamos el estilo de renglón de tabla
					ftOrdenes.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
					
					numeroFila++;
				}
			}
		});
	}
	
	/**
	 * Método que muestra toda la información de una orden de compra
	 * @param idOrden
	 */
	private void cargarMasInformacion(int idOrden)
	{
		P_DetalleOrdenCompraProducto pDetalleOrden = new P_DetalleOrdenCompraProducto(idOrden, false);
		pDetalleOrden.setGlassEnabled(true);
		pDetalleOrden.center();
		pDetalleOrden.show();
	}
}